<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      /* 
      ------分数注意事项-----
      本次测试满分为100(最多100分), 有4道加分题; 答案不够完整或者有错误当题0分处理; 

      ------分数处理-----
      (0-60]: 不及格, 处理: 提供第二份不同试卷晚自习的时候重新考试, 并在第二天晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (60-75]: 良良, 处理: 晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (75-90]: 良好, 处理: 放你一马, 好好复习;

      (90-100]: 优秀, 处理: 好好好, 继续保持;
      */

      // 1.JS延迟加载的方式有哪些？（5）
      //async 和 defer 
      //定时器
      //将script标签放在body标签的后面
      //onload js的事件

      // 2.前端 JavaScript 中的 ECMAScript、DOM、BOM 的含义；（5）
      //ECMAScript是ECMA的标准
      //DOM是文档对象模型
      //BOM是浏览器对象模型

      // 4.如何进行数据类型的判断？（5）
          //1.可以用typeof()进行判断 --- 直接返回类型
          //2.可以用instanceof() --- 返回Boolean值
          //3.Object.prototype.toString.call()判断 --- 返回类型


      // 5.null 和 undefined 的区别？什么时候会得到 undefined？（5）
      //null可以用于函数传参时进行初始化   --- （1）当访问的对象属性不存在时 （2）函数的默认返回值
      //null 空的声明变量
      //undefined 没有赋值的变量

      // 6.如何理解 null == undefined 返回 true，null === undefined 返回 false？（5）
      //null 和 undefined 的值都为空，所以返回true
      //null类型和undefined类型不同
      


      // 7.使用 continue 或 break 终止循环时，两种方式的区别是？（5）
      //continue是跳出当前循环，进行执行下一个循环
      //break 是终止循环 

      // 8.如何判断字符串内是否包含指定字符？（5）
      let str = "chenweiting"
      let arr = []
      console.log(str.indexOf('w'));
      console.log(str.lastIndexOf('w'));
      arr = str.split("")
      console.log(arr.includes("w"));

      function f4(value,search){
        return value.indexOf(search) > -1 ? true : false
      }
      f4("chenweiting","o")


      // 9.请尽量列举出数组的方法，并且注明哪些方法会修改原数组，哪些不会；（5）
      //arr.concat() 不会改变原数组
      //arr.push() 会改变原数组
      //arr.pop() 会改变原数组
      //arr.shift() 会改变原数组
      //arr.unshift() 会改变原数组
      //arr.slice() 不会改变原数组
      //arr.join() 不会改变原数组
      //arr.splice() 会改变原数组
      //arr.reverse() 会改变原数组
      //sort() 会改变原数组
      //indexOf() includes() 不会改变原数组

      // 10. 请写出下面语句的输出结果：（5）
      // let bar = true, number = 0;

      // console.log(bar + 0); --- 1

      // console.log(bar + "xyz"); --- truexyz
      // console.log(bar + true); --- 2
      // console.log(+true); --- 1
      // console.log(!'bluej'); --- false
      // console.log(number++); --- 0
      // console.log(++number); --- 2
      // console.log(number); --- 2

      // 11. 根据用户输入时间实现倒计时，输入时间格式错误时要有错误提示（5）
      
      /*
      let t = new Date(window.prompt("请输入目标时间")).getTime();
      function f6(){
        
        if(isNaN(t)){
          alert("无效的时间")
          clearInterval(timer)
          return
        }else{
          let time = (t-Date.now())/1000;
          if(time > 0){
            let d = parseInt(time/(60*60*24))
            let h = parseInt(time/(60*60)) % 24
            let m = parseInt(time/(60)) % 60
            let s = parseInt(time % 60)
            console.log(`剩余${d}天${h}小时${m}分${s}秒`);
          }else{
            alert("日期已过期")
            clearInterval(timer)
            return
          }
        }

      }
      let timer = setInterval(function(){
        f6()
      },1000)
      setTimeout(function(){
        clearInterval(timer)
      },5000)
      */
      
      /*
      let t = new Date(window.prompt("请输入目标时间")).getTime();
      let now = new Date()
      let cha = parseInt(t-now.getTime())
      let year = t.getFullYear() - now.getFullYear()
      let miao = Math.floor((cha%(1000*60))/1000) 
      miao = miao<10 ? "0"+miao : miao
      let min = Math.floor((cha%(1000*60*60))/(1000*60))
      min = min<10 ? "0"+min : min
      let hour = Math.floor((cha/(1000*60*60))%24)
      hour = hour<10 ? "0"+hour : hour
      let day = Math.floor(cha/(1000*60*60)/24)
      console.clear();
      console.log("倒计时还有:"+year+"年"+day+"日"+hour+"时"+min+"分"+miao+"秒");
      */

      // 12.输出从小到大排序好的五个不重复的随机"素数",范围[10-58)；（10）
      // 质数也叫素数是指在大于1的自然数中，除了1和它本身以外不再有其他因数的自然数，不能被任何整数整除的数。
      /*
      function f7(min,max,count){
        let arr = []//装随机的素数
        
        for(let i = 0;i<count;i++){
          let ran = Math.floor(Math.random() * (max-min)+min)
          let flag = true //true为素数
          for(let j = 2;j<ran;j++){
            if(ran%j == 0){
              flag = false
              break;
            }
          }
          if(flag && arr.includes(ran)){
            arr.push(ran)
          }else{
            i--
          }

        }
        return arr.sort()

      }

      f7(10,58,5)
      */
      // 13.把下面数组成员排序打乱；（5）
      
      function f1(){
        let arr13 = [10, 20, 30, 40, 50, 60];
        let newArr2 = []; // 打乱之后的数组

        for(let i = 0;i<arr13.length;i++){
          index = Math.floor(Math.random()*(arr13.length))
          if(!newArr2.includes(arr13[index])){
            newArr2.push(arr13[index]);
            
          }else{
            i--
          }
          
        }
        
        console.log(newArr2);
      }
        f1()


      // 14. 将多个数组进行去重合并；（10）
      let arr140 = [1, 2, 3],
        arr141 = [2, 3, 4, 5];

        for(let i = 0;i<arr141.length;i++){
          if(!arr140.includes(arr141[i])){
            arr140.push(arr141[i])
          }
        }
        console.log(arr140);

      // 15. 找出数组 arr=[1, 2, 3, "a", 4, "a", 2, 4, "a"] 中重复出现过的元素,并用数组将重复元素装起来输出,并且统计每个元素出现的次数（10）
/*
      let arr15 = [1, 2, 3, 'a', 4, 'a', 2, 4, 'a'];
      let obj = {};

      function f9(arr){
        arr.forEach(function (v){
          if(obj[v]){
            obj[v]++
          }else{
            obj[v] = 1 //默认出现次数为1次
          }
        })
        for(let k in obj){
          if(obj[k] > 1){
            console.log(`数字${k}出现${obj[k]}次`);
          }
        }
      }
      f9(arr15)
*/
      /*
      newArr3 = []
      let count = 0;
      for (let i = 0; i < arr15.length; i++) {
        if (arr15.indexOf(arr15[i]) !== arr15.lastIndexOf(arr15[i])) {
          
          if (newArr3.indexOf(arr15[i]) == -1) {
            newArr3.push(arr15[i]);
            count++;
          }
          obj=count
          
        }
      }
      console.log(count);
      console.log(newArr3);
      console.log(obj);

      */
      // 16. 找出数组中年龄小于18岁的女生的信息重新组成新的数组,并且将她们count变为现有的平方（10）
      let arr16 = [
        {
          name: '111',
          sex: 'boy',
          age: 18,
          count: 20,
        },
        {
          name: '222',
          sex: 'girl',
          age: 17,
          count: 30,
        },
        {
          name: '333',
          sex: 'boy',
          age: 16,
          count: 40,
        },
        {
          name: '444',
          sex: 'girl',
          age: 15,
          count: 50,
        },
        {
          name: '555',
          sex: 'boy',
          age: 20,
          count: 60,
        },
        {
          name: '666',
          sex: 'girl',
          age: 13,
          count: 70,
        },
        {
          name: '777',
          sex: 'boy',
          age: 14,
          count: 80,
        },
      ];

      function f2(){
        let newArr = []
        for(let i=0;i<arr16.length;i++){

            if(arr16[i].age<18 && arr16[i].sex=="girl"){
              let flag = arr16[i].count
              flag = flag * flag
              arr16[i].count = flag
              newArr.push(arr16[i])
          }

        }
        console.log(newArr);
      }
      f2()

      // 17. 实现一个深克隆函数 (加分题 5)

      // 18. 实现一个数组的reduce方法 (加分题 5)
      let arr5 = [11,22,33,44,55,66];
      let sum = arr5.reduce(function (total, value, arr5) {
        return total + value;
      }, 0);
      console.log(sum)
      
      // 19. 写出强制转换的方法有哪些 (加分题 5)
      //String() toString() Number()  Boolean()

      // 20. 如何判断一个对象是否为空对象的3种方法 (加分题 5)
      function fone(obj){
        for(var key in obj){
          return console.log(obj.key)
        }
        return console.log('空对象')
      }

      //JSON.stringify()
      //Object.keys()
      let o ={}
      console.log(Object);
    </script>
  </body>
</html>
